import 'package:flutter/material.dart';
import 'package:xbaistack/utils/helper.dart';

import '../utils/local_storages.dart';

/// 本地常量 Key，用于保存相关性配置数据
/// 存取都记得保持一致，否则会取错值~
const _LANGUAGE_KEY = "system.language";

/// Provider 的核心使用方式
/// 必须混入（或继承）ChangeNotifier 类，否则无法使用其功能哦~
final class AppLocaleProvider with ChangeNotifier {
  // attributes

  late bool _initialized = false; // 是否初始化过
  late Locale? _locale; // 语言编码对应的 Locale 实例
  late String? _language; // 用户选择的语言编码（当为空时跟随系统显示）

  // getter

  Locale? get locale => _locale;
  String? get language => _language;
  bool get isFollowSystem => Helper.isEmpty(_language);

  /// 确保本地数据一定会被初始化
  /// 所以需要在入口类中提前调用一次
  AppLocaleProvider ensureInitialized(BuildContext context) {
    if (!_initialized) {
      _language = LocalStorages.getString(_LANGUAGE_KEY);
      _locale = Helper.parseLocale(language);
      _initialized = true;
    }
    return this;
  }

  /// 保存语言设置数据
  /// 同时将其解析到当前应用内存中，后续可以直接使用 locale 进行语言文本展示
  void saveLanguage(String? language) {
    _language = language;
    _locale = Helper.parseLocale(_language);

    // 设置后根据值的不同视情况的不同而维护本地配置数据
    if (Helper.isEmpty(_language)) {
      LocalStorages.remove(_LANGUAGE_KEY);
    } else {
      LocalStorages.set(_LANGUAGE_KEY, _language!);
    }
  }

  /// 通知应用发起 UI 重绘
  void refresh() => notifyListeners();
}
